package com.ffox.service.impl;

import com.ffox.entity.ClassTeacher;
import com.ffox.entity.Clazz;
import com.ffox.entity.StudentInformation;
import com.ffox.entity.Teachers;
import com.ffox.mapper.SchoolStudentMapper;
import com.ffox.result.Result;
import com.ffox.service.SchoolStudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 学校学生相关业务实现类
 */
@Service
public class SchoolStudentServiceImpl implements SchoolStudentService {

    @Autowired
    private SchoolStudentMapper schoolStudentMapper;

    /**
     * 根据学校编号获取班级列表
     *
     * @param schoolNum 学校编号
     * @return 班级列表结果集
     */
    @Override
    public Result<List<Clazz>> getClassListBySchoolId(String schoolNum) {
        /*1、根据学校id查询班级表，查出学校所有班级
        * 2、根据班级中的教师id查询班主任姓名
        * */
        return Result.success("查询成功", schoolStudentMapper.getClassBySchoolId(schoolNum));
    }

    /**
     * 根据班级ID获取学生列表
     *
     * @param classId 班级ID
     * @return 学生信息列表结果集
     */
    @Override
    public Result<List<StudentInformation>> getStudentListByClassId(Long classId) {
        /*1、根据班级id查询学生表，查出班级所有学生
        * */

        return Result.success("查询成功", schoolStudentMapper.getStudentListByClassId(classId));
    }

    /**
     * 更新班级信息
     *
     * @param classId 班级ID
     * @param params 更新参数Map
     * @return 更新影响的行数
     */
    @Override
    public Integer updateClass(Long classId, Map<String, Object> params) {
        /*1、根据班级id修改班级*/
        return schoolStudentMapper.updateClass(classId,params);
    }

    /**
     * 删除班级
     *
     * @param classId 班级ID
     * @return 删除影响的行数
     */
    @Override
    public Integer deleteClass(Long classId) {
        /*1、根据班级id删除班级*/

        return schoolStudentMapper.deleteClass(classId);
    }

    /**
     * 删除学生（将学生所在班级置空）
     *
     * @param studentIdCard 学生身份证号
     * @return 更新影响的行数
     */
    @Override
    public Integer deleteStudent(String studentIdCard) {
        /*1、根据学生id删除学生表所属班级班级*/
        return schoolStudentMapper.updateStudentClass(studentIdCard, null);
    }

    /**
     * 添加班级
     *
     * @param classInfo 班级信息对象
     * @return 添加影响的行数
     */
    @Override
    public Integer addClass(Clazz classInfo) {
        classInfo.setCreateTime(LocalDateTime.now());
        /*1、添加班级*/
        return schoolStudentMapper.addClass(classInfo);
    }

    /**
     * 为学生分配班级
     *
     * @param studentIdCard 学生身份证号
     * @param classId 班级ID
     * @return 更新影响的行数
     */
    @Override
    public Integer addStudent(String studentIdCard, Long classId) {
        /*1、查询学生是否属于学校
        2、根据学籍号更改学生表中*/
        return schoolStudentMapper.updateStudentClass(studentIdCard,classId);
    }

    /**
     * 根据学校编号获取教师列表
     *
     * @param schoolNum 学校编号
     * @return 教师列表结果集
     */
    @Override
    public Result<List<Teachers>> getTeacherListBySchoolId(String schoolNum) {
        /*1、根据学校id查询教师表，查出学校所有教师
        * 2、根据教师id查询教师姓名
        * */
        return Result.success("查询成功", schoolStudentMapper.getTeacherBySchoolNum(schoolNum));
    }

    /**
     * 根据班级ID获取任课教师列表
     *
     * @param classId 班级ID
     * @return 班级教师关系列表结果集
     */
    @Override
    public Result<List<ClassTeacher>> getTeacherListByClassId(Long classId) {

        return Result.success("查询成功", schoolStudentMapper.getClassTeacherListByClassId(classId));
    }

    /**
     * 更新班级科目任课教师
     *
     * @param classId 班级ID
     * @param courseName 课程名称
     * @param teacherId 教师ID
     * @return 更新或添加影响的行数
     */
    @Override
    public Integer updateSubjectTeacherByClassId(Long classId, String courseName, String teacherId) {
        ClassTeacher classTeacher = new ClassTeacher();
        classTeacher.setClassId(classId);
        classTeacher.setCourseName(courseName);
        classTeacher.setTeacherId(teacherId);
        // 判断是否已存在该班级科目教师关系，不存在则新增，存在则更新
        if (schoolStudentMapper.getClassTeacherByClassIdAndCourseId(classId,courseName) == null){
            classTeacher.setCreatedAt(LocalDateTime.now());
            return schoolStudentMapper.addClassTeacher(classTeacher);
        };
        return schoolStudentMapper.updateClassTeacher(classTeacher);
    }

}
